package com.stb.llh.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;

public class HDFSClient {
    //共享一个分布式文件系统对象
    private FileSystem fs;


    public void before() throws IOException, InterruptedException {
//    连接hadoop，主机，配置文件，用户
        fs = FileSystem.get(URI.create("hdfs://hadoop102:9000"), new Configuration(), "atguigu");
        System.out.println("before");

    }

    //  上传文件，下载文件

    public void put() throws IOException, InterruptedException {
//    获取hadoop文件系统，hdfs是uri的访问模式，获取一个hdfs的抽象封装对象
        FileSystem fileSystem = FileSystem.get(URI.create("hdfs://hadoop102:9000"), new Configuration(), "atguigu");
        //上传文件到hdfs的根目录，  本地路径  hdfs文件系统路径
        fileSystem.copyFromLocalFile(new Path("E:\\Demo/d.txt"), new Path("/"));
//    从hdfs系统中下载到本地来11，用这个对象操作封装系统  hdfs路径 本地路径
//    fileSystem.copyToLocalFile(new Path("/wcinput"),new Path("E:\\Demo"));
//    关闭文件系统,必须哦
        fileSystem.close();
    }

    //  修改文件名字

    public void rename() throws IOException, InterruptedException {
        //获取文件系统
        FileSystem fileSystem = FileSystem.get(URI.create("hdfs://hadoop102:9000"), new Configuration(), "atguigu");
//    操作，修改hdfs文件名字，原来的名字 现在的名字
        fileSystem.rename(new Path("/etc"), new Path("/etc1"));
//    关闭
        fileSystem.close();

    }

    //  删除文件

    public void delete() throws IOException {
        boolean delete = fs.delete(new Path("/d.txt"), true);  //buer类型
        if (delete) {
            System.out.println("删除成功");
        } else
            System.out.println("删除失败");
    }

    //  向文件追加内容

    public void du() throws IOException {
//    建立一个hdfs文件输出流 ，原文件 大小
        FSDataOutputStream append = fs.append(new Path("/d.txt"), 1024);
//    本地文件输入流对象
        FileInputStream open = new FileInputStream("E:\\Demo/d.txt"); //这是追加的内容
        IOUtils.copyBytes(open, append, 1024, true);  //追加的内容  追加到的位置

    }


    public void ls() throws IOException {
//    建立一个文件数组对象


        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : fileStatuses) {
            if (fileStatus.isFile()) {
                System.out.println("是文件");
                System.out.println(fileStatus.getPath());
                System.out.println(fileStatus.getLen());
            } else {
                System.out.println("不是文件");
                System.out.println(fileStatus.getPath());
            }
        }
    }


    public void listFiles() throws IOException {
//    分块
        RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
        while (files.hasNext()) {
            LocatedFileStatus file = files.next();
            System.out.println("______________");
            System.out.println(file.getPath());
            System.out.println("块信息");
            BlockLocation[] blockLocations = file.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                String[] hosts = blockLocation.getHosts();
                System.out.println("块在");
                for (String host : hosts) {
                    System.out.println(host + " ");


                }


            }
        }
    }


    public void after() throws IOException {
        System.out.println("after");
        fs.close();
    }

}
